#pragma once

#include <sys/epoll.h>
#include <functional>
#include <unordered_map>
#include <memory>
#include <mutex>
#include <thread>

class EventLoop {
public:
    using EventCallback = std::function<void(uint32_t)>;

    // 添加一个参数，用于控制单次最多处理的fd数量
    EventLoop(size_t max_events);
    ~EventLoop();

    // 添加事件
    void add(int fd, uint32_t events, EventCallback callback);
    
    // 修改事件
    void modify(int fd, uint32_t events);
    
    // 删除事件
    void remove(int fd);
    
    // 运行事件循环
    void run();
    
    // 停止事件循环
    void stop();

private:
    size_t max_events_ = 64;
    std::unique_ptr<epoll_event[]> events_;
    int epoll_fd_ = -1;
    std::mutex running_mutex_;
    bool running_ = false;
    std::mutex mutex_;
    std::unordered_map<int, EventCallback> callbacks_;
    
    void processEvents(int nfds);
};
